package main

import (
	"fmt"
	"reflect"
)

func main() {
	// 通过类型信息创建实例
	var a int

	// 1. 拿到类型
	typeOfA := reflect.TypeOf(a)
	fmt.Println(typeOfA.Name()) // int

	// 2. 用反射 new 一个 *int 零值
	aIns := reflect.New(typeOfA)                // aIns 是 reflect.Value，装的是 *int
	fmt.Println("new 零值 ->", aIns.Elem().Int()) // 0

	// 3. 把「变量 a 的地址」再包成 reflect.Value 赋回去
	aIns = reflect.ValueOf(&a)                  // 现在 aIns 指向真实变量 a
	fmt.Println("重新指向 a ->", aIns.Elem().Int()) // 0

	// 4. 验证可写
	aIns.Elem().SetInt(100)
	fmt.Println("a =", a) // 100
}
